/////////////////////////////////////////////////////////////
//@File Name                : alarm_audio.c
//@Created data             : 2020/12/29
//@Author                   : jqiu
//@blog                     : opencore-amr
//@Description              : 
/////////////////////////////////////////////////////////////

#include <alarm_flashcd.h>
#include "event.h"
//#include "macros.h"
#include "uart.h"
#include <spi_flash.h>
//#include "alarm_device.h"
#include "uctypes.h"
#include "sectdefs.h"
//#include "alarm_audio.h"
#include <string.h>


#define FLASH_TABLE          0x1c9000
#define COPY_CODE_ADDR       0xb000
#define UP_CODE_LEN          0x7000
#define BOOT_CODE_LEN        0x3000
#define FREAM_LEN       135
#define PAGE_LEN        128
#define FLASH_FLAG      0xfc0

u8_t flash_cd_flag = 0;


//void flash_cd()
//{
//	u8_t data[PAGE_LEN];
//	int flag = 8088;
//	int addr = FLASH_TABLE;
//	
//	FlashQRead(FLASH_TABLE,data,PAGE_LEN);
//	
//	memcpy(&data[FLASH_FLAG],(char*)&flag,4);
//	
//	FlashEnableWr();
//	FlashEraseSector(FLASH_TABLE);
//	for(int i = 0;i < 32; i++)
//	{
//		FlashEnableWr();
//		FlashPageProgram(addr,(u8_t*)&data[i*128],128);	 // set flash cd flag
//		addr = addr + 128;
//	}
//	
//	mcu_restart();
//}


//void ISR_UART0(void)
//{
//	ICP |= 1<<23;
//	char *cmd = "ucchip_flashcd";
//	char temp;
//    if(uart_get_int_identity()&0x4)
//	{
//		for(int i = 0; i < 14; i++)
//		{
//			temp = uart_getchar();
//			if(temp != cmd[i])
//			{
//				return;
//			}
//		}
//		flash_cd_flag = 1;
//    }
//}
//
//u8_t check_data_sum(u8_t *buf, int sz)
//{
//	u8_t  cks = 0;
//	for(int i=0;i<sz;i++)
//	{
//		cks += buf[i];
//	}
//	if(cks != buf[sz])
//	{
//		return 1;
//	}
//	return 0;
//}
//
//void app_flag(u8_t* flags)
//{
//	FlashEnableWr();
//	FlashEraseSector(FLASH_TABLE);
//	FlashEnableWr();
//	FlashPageProgram(FLASH_TABLE,flags,4);	//  set flash cd flag
//}

void download_flash(u32_t addr,u8_t *buf,u8_t len)
{
	if(addr%4096)
	{
		FlashEnableWr();
		FlashPageProgram(addr,buf,len);	 // set flash cd flag
	}
	else
	{
		FlashEnableWr();
		FlashEraseSector(addr);
		FlashEnableWr();
		FlashPageProgram(addr,buf,len);	 // set flash cd flag
	}
}

//void copy_code()
//{
//	u8_t data[1024];
//	u32_t code_len = UP_CODE_LEN - BOOT_CODE_LEN;
//	u32_t num = code_len/1024;
//	u32_t addr = BOOT_CODE_LEN;
//	u32_t s_addr = COPY_CODE_ADDR;
//	
//	for(int i=0;i<num;i++)
//	{
//		for(int j=0;j<8;j++)
//		{
//			FlashQRead(s_addr,&data[j*PAGE_LEN],PAGE_LEN);
//			s_addr = s_addr + PAGE_LEN;
//			printf("s_addr = %x\r\n",s_addr);
//		}
//		for(int j=0;j<8;j++)
//		{
//			download_flash(addr,&data[j*PAGE_LEN],PAGE_LEN);
//			addr = addr + PAGE_LEN;
//			printf("addr = %x\r\n",addr);
//		}
//	}
//	printf("copy end\r\n");
//	
//}

//void uart_download()
//{
//	u8_t rx_buf[140];
//	int addr = 0;
//	int flag = 0;
//	int i=0;
//	while(1)
//	{
//		if(uart_getchar_unblock((char*)rx_buf,1000))
//		{
//			printf("header = %c\r\n",rx_buf[0]);
//			switch(rx_buf[0])
//			{
//				case UPKT_TOKEN_A:
//					for(i=1;i<UPKT_A_LEN;i++)
//					{
//						rx_buf[i] = uart_getchar();
//					}
//					if(check_data_sum(rx_buf, UPKT_A_LEN-1))
//					{
//						uart_sendchar(NACK);
//						break;
//					}
//					addr = (rx_buf[1] << 16);
//					addr += (rx_buf[2] << 8);
//					addr += (rx_buf[3]);
//					printf("addr = %x\r\n",addr);
//					uart_sendchar(ACK);
//					break;
//				case UPKT_TOKEN_D:
//					for(i=1;i<UPKT_D_LEN;i++)
//					{
//						rx_buf[i] = uart_getchar();
//					}
//					if(check_data_sum(rx_buf, UPKT_D_LEN-1))
//					{
//						uart_sendchar(NACK);
//						break;
//					}
//					else
//					{
////						printf("download flash\r\n");
//						download_flash(addr,&rx_buf[2],rx_buf[1]);
//						uart_sendchar(ACK);
//						addr = addr + rx_buf[1];
//						printf("addr = %x\r\n",addr);
//					}
//					break;
//				case UPKT_TOKEN_E:
//					rx_buf[1] = uart_getchar();
//					if(check_data_sum(rx_buf,UPKT_E_LEN-1))
//					{
//						uart_sendchar(NACK);
//					}
//					else
//					{
//						uart_sendchar(ACK);
//					}					
//					return ;       // end
//				default: break;
//			}
//		}
//	}
//}
//
//void clear_rodata_cache(void)
//{
//	volatile u8_t* rodata_ptr;
//	register u32_t index = 0;
//	rodata_ptr = (u8_t*)(0x200000+0x100000-(16*1024));
//	for(index = 0;index < (16*1024);index++)
//	{
//		(void)rodata_ptr[index];
//	}
//}
